package com.infomancers.tests.trackerissues;

import com.infomancers.collections.yield.Yielder;
import org.junit.Assert;
import org.junit.Test;

import java.util.Arrays;
import java.util.Iterator;

/**
 * Copyright (c) 2009, Aviad Ben Dov
 * <p/>
 * All rights reserved.
 * <p/>
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * <p/>
 * 1. Redistributions of source code must retain the above copyright notice, this list
 * of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice, this
 * list of conditions and the following disclaimer in the documentation and/or other
 * materials provided with the distribution.
 * 3. Neither the name of Infomancers, Ltd. nor the names of its contributors may be
 * used to endorse or promote products derived from this software without specific
 * prior written permission.
 * <p/>
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

public class Issue11 {
    public static class SomeYielder extends Yielder<Integer> {

        private final Integer[] values;

        public SomeYielder(Integer... values) {
            this.values = values;
        }

        @Override
        protected void yieldNextCore() {
            for (Integer i : values) {
                yieldReturn(i);
            }
        }

    }

    public static class MyYielder extends Yielder<Integer> {

        private final Iterable<Integer> i1;
        private final Iterable<Integer> i2;

        public MyYielder(Iterable<Integer> i1, Iterable<Integer> i2) {
            this.i1 = i1;
            this.i2 = i2;
        }

        @Override
        protected void yieldNextCore() {
            for (Integer i : i1) {
                yieldReturn(i);
            }
            for (Integer i : i2) {
                yieldReturn(i);
            }
        }
    }

    @Test
    public void test() {
        Iterator<Integer> expected = Arrays.asList(1, 2, 3, 4, 5, 6).iterator();
        Iterator<Integer> actual = new MyYielder(new SomeYielder(1, 2, 3), new SomeYielder(4, 5, 6)).iterator();


        while (expected.hasNext() && actual.hasNext()) {
            Assert.assertEquals(expected.next(), actual.next());
        }

        Assert.assertFalse("too few in actual", expected.hasNext());
        Assert.assertFalse("too many in actual", actual.hasNext());
    }

}
